<?php
class Controller_Profile extends Controller_Base {
	
	private $usertype;
	/**
	 * Выбор действия по URL
	 *
	 */
	public function action() {
		Service_Debug::setDebug();
		switch ($this->arrRequest[0]) {
			case 'profile':
				$objSession = User_Session::instance();
				$objUser = new User_User($objSession->getUserId());
				switch ($this->arrRequest[1]) {
					case '': //Если адрес вида /profile (Просмотр своего профиля обычным пользователем)
						if($objUser->id) $this->showMyProfile($objUser);
						exit();
					case 'edit':
						if (!$this->arrRequest[2]) { //Если адрес вида /profile/edit (Редактирование своего профиля обычным пользователем)
							$this->editProfile($objUser);
							exit();
						}
					case 'contracts': //Страницы договоров
						if($objSession->isLoggedIn()) {
							if(!$this->arrRequest[2]) {// Просмотр списка последних договоров
								if(isset($_GET['option'])) {
									if ($_GET['option'] == 'with_responses') $this->showContractsPage($objUser, 'with_responses');
								}
								else $this->showContractsPage($objUser, 'all');
								exit();
							}
							else {
								$objContract = new Contract($this->arrRequest[2]);
								if($objContract->id) {
									$this->showContractpage($objUser,$objContract);
									exit();
								}
								else $this->setError(404);
							}
						}
					case 'orders':
						if (!$this->arrRequest[2] && $objSession->isLoggedIn()) { //Если адрес вида /profile/orders (Список заказов котрые оставил "заказчик" или список заказов, на который откликнулся "мастер")
							$this->userOrdersList($objUser);
							exit();
						}
						else $this->setError(404);
					case 'questions' : //Страницы вопросов и ответов
						if (!$this->arrRequest[2] && $objSession->isLoggedIn()) { //Если адрес вида /profile/questions (Список вопросов и ответов, оставленных пользователем)
							if(isset($_GET['option'])) {
								if ($_GET['option'] == 'with_answers') $this->userQuestionsList($objUser, 'with_answers');
							}
							else $this->userQuestionsList($objUser, 'user_questions');
							exit();
						}
				}
			case 'master':
				$usertype = 'master';
				break;
			case 'customer':
				$usertype = 'customer';
				break;
			default: 
				$this->setError(404);
				exit();
		}
			if (is_numeric($this->arrRequest[1]) && !$this->arrRequest[2]){// Если адрес вида /user_type/12345 (Просмотр профиля другого пользователя мастера/закзчика)
				$objUser = new User_User($this->arrRequest[1]);
				if ($objUser->id && $objUser->getField('user_type') == $usertype ) $this->showProfile($objUser);
				else $this->setError(404);
			}
			elseif ($this->arrRequest[1] == 'edit' && is_numeric($this->arrRequest[2]) && SimpleAdministration::isAdmin()) {//Если адрес вида /user_type/edit/12345 (Редактирование профиля админом)
				$objUser = new User_User($this->arrRequest[2]);
				if ($objUser->getField('user_type') == $usertype ) $this->editProfile($objUser);
				else $this->setError(404);
			}
			else $this->setError(404);
	}
	
	/**
	 * Выводит страницу профиля пользователя "его глазами"
	 * @param user $objUser - Объект текущего пользователя
	 */
	public function showMyProfile($objUser){
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
		$objViewProfile = new View_Profile();
	
		$this->title = 'Ваш профиль';
		$this->showHeader();
		$objViewProfile->showMyProfile($objUser);
		$this->showFooter();
	}
	
	public function showProfile($objUser){
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
		$objViewProfile = new View_Profile();
		
		if (User_User::getUserEmail($objSession->getUserId()) != $objUser->getField('e_mail'))$this->title = $this->pageHead = 'Профайл пользователя ' . $objUser->getField('e_mail');
		else $this->title = $this->pageHead = 'Ваш профиль';
		
		$this->bodyAttrs = 'class="profile-page"';
		$this->showHeader();
		$objViewProfile->showProfile($objUser);
		$this->showFooter();
	}
	public function showContractsPage($objUser, $showType) {
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
		
		$fieldToFind = $objUser->getField('user_type') == 'customer' ? '`ID_master`' : '`ID_user`';
		$myField = $objUser->getField('user_type') == 'customer' ? '`ID_user`' : '`ID_master`';
		
		$objContract = new Contract();
		$importantContractsArr = array();
		
		// Выводим только договоры с отзывами (новые договоры(с новыми отзывами, только что принятые или только что отмененные...) здесь не выводятся)
		if ($showType == 'with_responses') $arrContracts = $objContract->find('all', array('select' => "`contract`.`ID_contract`,`contract`.`contract_name`,`contract`.`contract_description`,`contract`.`first_name` AS `contract_first_name`,`contract`.`last_name` AS `contract_last_name`,`contract`.`middle_name` AS `contract_middle_name`,`contract`.`deadline`,`contract`.`city`,`contract`." . $fieldToFind . " AS ID_user,`contract`.`answer_date`,`contract`.`status`,`user`.`first_name` AS `first_name`,`user`.`last_name` AS `last_name`", 'joins' => "LEFT JOIN `user` ON `contract`." . $fieldToFind . "=`user`.`ID_user`  LEFT JOIN `contract_response` USING (`ID_contract`)", 'conditions' => "`contract`." . $myField ."='" . $objUser->id . "' AND `contract_response`.`ID_contract_response` IS NOT NULL", 'order' => '`contract`.`created_at` DESC'));
		elseif($objUser->getField('user_type') == 'master') {// Если мастер
			if ($showType == 'all') {// Если выбрал "все договоры"
				// Массив новых договоров(неподписанные договоры и договоры с непрочитанными отзывами)
				$importantContractsArr = $objContract->find('all', array('select' => "`contract`.`ID_contract`,`contract`." . $fieldToFind . " AS ID_user,`contract`.`status`,`user`.`first_name`, `user`.`last_name`, IF(`contract`.`status`=1,`contract_response`.`created_at`,`contract`.`created_at`) created_at", 'joins' => "LEFT JOIN `user` ON `contract`." . $fieldToFind . "=`user`.`ID_user` LEFT JOIN `contract_response` USING (`ID_contract`)", 'conditions' => "`contract`." . $myField ."='" . $objUser->id . "' AND (`contract`.`status` IS NULL OR `contract_response`.`is_read` = 0)", 'order' => '`created_at` DESC'));
				// Массив остальных договоров(договоры на которые мастер уже откликнулся и которые в тоже время не имеют отзывов или отзывы по ним уже прочитаны)
				$arrContracts = $objContract->find('all', array('select' => "`contract`.`ID_contract`,`contract`.`contract_name`,`contract`.`contract_description`,`contract`.`first_name` AS `contract_first_name`,`contract`.`last_name` AS `contract_last_name`,`contract`.`middle_name` AS `contract_middle_name`,`contract`.`deadline`,`contract`.`city`,`contract`." . $fieldToFind . " AS ID_user,`contract`.`answer_date`,`contract`.`status`,`user`.`first_name` AS `first_name`,`user`.`last_name` AS `last_name`", 'joins' => "LEFT JOIN `user` ON `contract`." . $fieldToFind . "=`user`.`ID_user` LEFT JOIN `contract_response` USING (`ID_contract`)", 'conditions' => "`contract`." . $myField ."='" . $objUser->id . "' AND (`contract`.`status` IS NOT NULL AND (`contract_response`.`ID_contract_response` IS NULL OR `contract_response`.`is_read`=1))", 'order' => '`contract`.`created_at` DESC'));
			}
		}
		elseif($objUser->getField('user_type') == 'customer') {
			if ($showType == 'all') {// Если выбрал "все договоры"
				// Массив новых договоров(договоры, на которые ответил мастер, но пользователь их ещё не просмотрел)
				$importantContractsArr = $objContract->find('all', array('select' => "`contract`.`ID_contract`,`contract`.`is_read_by_customer`,`contract`." . $fieldToFind . " AS ID_user,`contract`.`answer_date`,`contract`.`status`,`user`.`first_name`,`user`.`last_name`", 'joins' => "LEFT JOIN `user` ON `contract`." . $fieldToFind . "=`user`.`ID_user`", 'conditions' => "`contract`." . $myField ."='" . $objUser->id . "' AND (`contract`.`status` IS NOT NULL AND `contract`.`is_read_by_customer`=0)", 'order' => '`contract`.`created_at` DESC'));
				// Массив остальных договоров(договоры, отклик мастера на которые текущий пользователь уже просмотрел и договоры, которые ожидают ответа мастера)
				$arrContracts = $objContract->find('all', array('select' => "`contract`.`ID_contract`,`contract`.`contract_name`,`contract`.`contract_description`,`contract`.`first_name` AS `contract_first_name`,`contract`.`last_name` AS `contract_last_name`,`contract`.`middle_name` AS `contract_middle_name`,`contract`.`deadline`,`contract`.`city`,`contract`." . $fieldToFind . " AS ID_user,`contract`.`answer_date`,`contract`.`status`,`user`.`first_name` AS `first_name`,`user`.`last_name` AS `last_name`", 'joins' => "LEFT JOIN `user` ON `contract`." . $fieldToFind . "=`user`.`ID_user`", 'conditions' => "`contract`." . $myField ."='" . $objUser->id . "' AND (`contract`.`is_read_by_customer`=1 OR `contract`.`status` IS NULL)", 'order' => '`contract`.`created_at` DESC'));
			}
		}

		$objViewProfile = new View_Profile();
		$this->bodyAttrs = 'class="contracts-page"';
		$this->title = 'Мои договоры';
		$this->showHeader();
		$objViewProfile->showContractsPage($objUser,$arrContracts,$importantContractsArr);
		$this->showFooter();
	}
	
	public function showContractPage($objUser,$objContract) {
		Service_Debug::setDebug();
		$objViewProfile = new View_Profile();
		$this->bodyAttrs = 'class="contract-page"';
		$this->title = 'Договор №' . $objContract->id ;
		$this->showHeader();
		$objViewProfile->showContractPage($objUser,$objContract);
		$this->showFooter();
	}
	
	public function editProfile($objUser){
		$editId = $objUser->id;
		$userType = $objUser->getField('user_type');
		if (isset($_POST['User_User'])) {
			$objUser = new User_User($_POST['User_User']);
			if ($objUser->id != $editId) User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH), Service_Translate::getText('Недопустимое действие'));
			$fileArray = $_FILES['profile-photo-upload'];
			if (!empty($fileArray['name'])) $objUser->saveAvatar(&$fileArray);
			if ($userType == 'master' && isset($_POST['User_User']['Category'])) {
				if ($objUser->save()){
					$objUser->saveCategories($_POST['User_User']['Category']);
					User_Session::moveTo(W_ABSPATH . 'profile', 'Профиль успешно обновлён!', 1);;
				}
			}
			if ($userType == 'customer') {
				if ($objUser->save()) User_Session::moveTo(W_ABSPATH . 'profile', 'Профиль успешно обновлён!', 1);
			}
		}
		$objViewProfile = new View_Profile();
		$this->showLeftColumn = true;		
		$this->title = $this->pageHead = 'Редактирование профайла ' . $objUser->getField('e_mail') ;
		$this->showHeader();
		$objViewProfile->showEditForm($objUser,Category::getList());
		$this->showFooter();
	}
	
	/**
	 * Выводит страницу заказов пользователя
	 * @param user $objUser - Объект текущего пользователя
	 */
	public function userOrdersList ($objUser) {
		Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		$objViewProfile = new View_Profile();
		$this->bodyAttrs = 'class="user-orders-page"';
		$objOrder = new Order();
		// Если текущий пользователь - мастер, то получаем массив заказов, на которые он откликнулся
		if ($objUser->getField('user_type') == 'master') {
			$ordersArray = $objOrder->find('all', array('select' => 'count(`order_response`.`ID_order_response`) as `order_responses`,`order`.`ID_order`, `order`.`order_name`, `order`.`status`,`order`.`created_at` AS `order_created_date`,`order_response`.`created_at` AS `order_response_created_date`,`city_url`.`city_name`', 'joins' => 'INNER JOIN  `city_url` USING(`city`) RIGHT JOIN `order_response` USING (`ID_order`)', 'group' => 'ID_order', 'order' => '`order_response`.`created_at` DESC','conditions' => "`order_response`.`ID_user`='" . $objUser->id ."'"));
			$importantOrdersArray = null;
		}
		elseif ($objUser->getField('user_type') == 'customer') { //Если же пользователь - заказчик, то массив всех его заказов, а также новых заказов
			$ordersArray = $objOrder->find('all', array('select' => 'count(`order_response`.`ID_order_response`) as `order_responses`,`order`.`ID_order`, `order`.`order_name`, `order`.`status`,`order`.`created_at` AS `order_created_date`,`order_response`.`created_at` AS `order_response_created_date`,`city_url`.`city_name`', 'joins' => 'INNER JOIN  `city_url` USING(`city`) LEFT JOIN `order_response` USING (`ID_order`)', 'group' => 'ID_order', 'order' => '`order_response`.`created_at` DESC','conditions' => "`order`.`ID_user`='" . $objUser->id ."'"));
			$stmt = "SELECT `temp`.`ID_order`,`temp`.`created_at`,`order`.`order_name`,COUNT(`temp`.`ID_order_response`) AS new_responses_count
					FROM `order`
					RIGHT JOIN ( SELECT `order_response`.`ID_order`,`order_response`.`created_at`,`order_response`.`ID_order_response`
								 FROM `order_response`
								 WHERE `order_response`.`is_read`=0
								 ORDER BY `order_response`.`created_at` DESC
								)temp
					ON `temp`.`ID_order`=`order`.`ID_order`
					WHERE `order`.`ID_user`='" . $objUser->id . "'
					GROUP BY `temp`.`ID_order`
					ORDER BY `temp`.`created_at` DESC";
			$importantOrdersArray = $objDB->select($stmt);
		}
		$this->title = 'Мои заказы';
		$this->showHeader();
		$objViewProfile->showOrdersPage($objUser,$ordersArray,$importantOrdersArray);
		$this->showFooter();
	}
	
	/**
	 * Выводит страницу вопросов и овтетов пользователя
	 * @param user $objUser - Объект текущего пользователя
	 * @param string @option - Опция показа (вопросы, ответы, комментарии)
	 */
	public function userQuestionsList ($objUser,$option) {
		Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		$objViewProfile = new View_Profile();
		$this->bodyAttrs = 'class="user-questions-page"';
		$objQuestion = new Question();

		if($option == 'user_questions') { // Получаем список вопросов, которые задал пользователь
			$stmt = "SELECT question.`question_name`,`question`.`ID_question`,`question`.`viewings`,`question`.`created_at`,COUNT(`temp`.`ID_answer`) AS answers_count,`temp`.`created_at` AS `last_answer_date`,`temp`.`first_name`,`temp`.`last_name`,`temp`.`user_type`,`temp`.`ID_user`
					FROM `question`
					LEFT JOIN (
								SELECT `answer`.*,`user`.`first_name`,`user`.`last_name`,`user`.`user_type`
								FROM `answer`
               			 		JOIN `user`
               					ON `answer`.`ID_user` = `user`.`ID_user`
								ORDER BY `answer`.`created_at` DESC
							)temp
					ON `temp`.`ID_question` = `question`.`ID_question`
					WHERE `question`.`ID_user` ='" . $objUser->id .
					"' GROUP BY `question`.`ID_question`
					ORDER BY 4 DESC";
		}
		elseif ($option == 'with_answers') { // Получаем список вопросов, на которые пользователь отвечал
			$stmt = "SELECT question.`question_name`,`question`.`ID_question`,`question`.`viewings`,`answer`.`created_at` 
			FROM `question`
			RIGHT JOIN `answer` USING (`ID_question`)
			WHERE `answer`.`ID_user`='" . $objUser->id . "'
			ORDER BY 4";
		}
		$questionsArray = $objDB->select($stmt);
		// Массив важных вопросов (вопросы текущего пользователя с ответами, которые он ещё не просмотрел)
		$stmt = "SELECT `temp`.`ID_question`,`temp`.`created_at`,`question`.`question_name`,COUNT(`temp`.`ID_answer`) AS new_answers_count
				FROM `question`
				RIGHT JOIN ( SELECT `answer`.*
							FROM `answer`
							RIGHT JOIN `question` USING(`ID_question`)
							WHERE `question`.`ID_user`='" . $objUser->id . "' AND `answer`.`is_read`=0
							ORDER BY `answer`.`created_at` DESC
				)temp
				ON `temp`.`ID_question`=`question`.`ID_question`
				GROUP BY `temp`.`ID_question`
		ORDER BY `temp`.`created_at` DESC";
		
		$importantQuestionsArray = $objDB->select($stmt);
		$this->title = 'Вопросы и ответы';
		$this->showHeader();
		$objViewProfile->showUserQuestionsList($objUser, &$questionsArray, &$importantQuestionsArray, $option);
		$this->showFooter();
	}
	
}
?>